---
---

Spring 的出现是为了 “如何让应用程序能以超出当时大众所惯于接受的易用性和稳定性与 J2EE 平台上的不同组件合作”

它的设计初衷是用于构造 Java 应用程序的轻量级框架
1. 可以采用 Spring 来构造任何程序，而不限于 Web 程序
2. 轻量级：最少的侵入，与应用程序解耦，接入成本低
3. 最直观的感受： 基于 POJO，构建出稳健而强大的应用
## 总体架构设计

## Spring 的总体架构以及学习路径
<img src="https://wkq-img.oss-cn-chengdu.aliyuncs.com/20241229140955.png"/>

<img src="https://wkq-img.oss-cn-chengdu.aliyuncs.com/20241229143555.png"/>


Test 主要为测试提供支持

core container 是 Spring 的核心模块。

其中的 Beans 模块是所有模块都要应用到的，它包含访问配置文件、创建和管理 Bean，以及进行 IOC 和 DI 相关操作的类。其里面的 BeanFactory 接口是 Spring 框架的核心接口。

Beans 模块依赖于 Core 模块，Core 模块包含Spring 框架的核心工具类、Spring 的其它组件都要使用到这个包里的类，Core 模块是其它组件的基本核心。

Context 是 Spring 的上下文，也称为 IOC 容器，通过上下文可以获取到容器中的 Bean  ，ApplicationContext 接口是 Context 模块的关键。与 BeanFactory 默认的延迟加载策略不同，ApplicationContext 容器实例化后，会自动给所有的单实例Bean 进行实例化，以及依赖关系的装配。

Context 模块构建于 Core 和 Beans 模块的基础之上，提供了一种注册式的对象框架访问方法。

SpEL 则是 Spring 的表达式语言，SpEL 是 Spring 框架的一种表达式语言，它提供了一种在运行时动态计算表达式的方式。可用于将 Bean 或者 Bean 的属性注入另外一个 Bean。还支持 Bean 的方法调用。





Core Container 模块上方的是三个 AOP 模块（AOP、Aspects、Instrumentation）以及支持消息通信的 Messaging 模块。


IOC 和 AOP 是 Spring 实现轻量级的超关键因素，必须重点关注。

## Spring  核心模块
### Spring-core
1. 包含框架基本的核心工具类，其它组件都要使用到这个包里的类。
2. 定义并提供了资源的访问方式


为 AOP、IOC 提供了最基础的服务
### spring-beans
Spring 主要面向 Bean 编程 （BOP）
1. Bean 的 <RedSpan>定义</RedSpan>
2. Bean 的<RedSpan>解析</RedSpan>
3. Bean 的<RedSpan>创建</RedSpan>

最需要关注的接口是 BeanFactory

### spring-context
* 为 Spring 提供运行时环境，保存对象的状态。
* 扩展了 BeanFactory，为其添加了 Bean 的生命周期控制，框架事件体系，资源透明化等功能。此外，该模块还提供了很多企业级的支持，比如 事件监听、远程访问等。

ApplicationContext 是该模块的核心接口，也是典型代表，是 BeanFactory 的超类。

与 BeanFactory 的延迟加载策略不同， ApplicationContext 容器实例化后，会自动给所有的单实例Bean 进行实例化，以及相关依赖关系的装配。

:::tip
Bean 包装的是 Object ，Object 必然有数据，如何给这些数据提供生产环境就是 context 要解决的问题。对于 context 来说，就是要发现每个 bean 之间的关系，并建立和维护好这种关系。
:::

### spring-aop
最小化的动态代理实现
* 基于 JDK 动态代理实现
* 基于 Cglib 动态代理实现
上面两种代理模式只能使用运行时织入，仅支持方法级编织，仅支持方法执行切入点。


## 编译 Spring 源码

* 安装 JDK，maven、idea。
* 下载源码并进行编译

